package cn.tt.tuantuanerp.tuantuanerp.product.service;

import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.dto.productModule.SkuAddNewBasicDTO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.dto.productModule.SkuAddNewDTO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.dto.productModule.SkuUpdateDTO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.entity.Sku;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.entity.SkuCheckInfo;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.entity.SkuOrderInfo;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.entity.SkuPurchaseInfo;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.vo.SkuDetailsVO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.vo.SkuForCheckVO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.vo.SkuForOrderVO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.vo.SkuForPurchaseVO;
import cn.tt.tuantuanerp.tuantuanerp.comment.pojo.vo.SkuListItemVO;
import cn.tt.tuantuanerp.tuantuanerp.comment.security.LoginPrincipal;

import java.util.List;

/**
 * sku相关业务的接口
 * @author 廖大威威
 */


public interface ISkuService {



    /**
     * 添加新sku的业务接口
     * @param skuAddNewDTO 新增sku的数据封装
     */
    void addNew(SkuAddNewDTO skuAddNewDTO,LoginPrincipal loginPrincipal);

    /**
     * 添加新sku的业务
     * @param skuAddNewBasicDTO 新增sku基础(仅有部分字段)信息
     */
    void addNew(SkuAddNewBasicDTO skuAddNewBasicDTO, LoginPrincipal loginPrincipal);

    /**
     * 修改/更新 sku数据
     * @param skuUpdateDTO 需要更新的sku数据封装
     */
    void updateById(SkuUpdateDTO skuUpdateDTO, LoginPrincipal loginPrincipal);

    /**
     * 根据id删除sku
     * @param id 需要删除的商品的id
     */
    void deleteById(Long id, LoginPrincipal loginPrincipal);

    /**
     * 通过id查询sku信息
     * @param id 需要查询的skuId
     * @return sku实体
     */
    SkuDetailsVO getDetailById(Long id, LoginPrincipal loginPrincipal);

    /**
     * 查询sku列表
     * @return sku列表集合
     */
    List<SkuListItemVO> list(int pageIndex,int pageSize,LoginPrincipal loginPrincipal);

    /**
     * 为订单查询商品
     * @param id id
     * @param loginPrincipal 当事人
     * @return 数据
     */
    SkuForOrderVO getSkuForOrder(Long id, LoginPrincipal loginPrincipal);

    /**
     * 为添加盘点功能查询商品
     * @param id id
     * @param loginPrincipal 当事人
     * @return 数据
     */
    SkuForCheckVO getSkuFroCheck(Long id, LoginPrincipal loginPrincipal);


    /**
     * 新增sku时,通过skuid查询sku信息
     * @param skuId
     * @return
     */
    Sku getSkuInfoByApiForAddNew(Long skuId);

    /**
     *
     * @param skuId
     * @return
     */
    SkuListItemVO getListItemById(Long skuId);

    /**
     * 为添加采购单功能查询商品
     * @param id id
     * @param loginPrincipal 当事人
     * @return 数据
     */
    SkuForPurchaseVO getSkuFroPurchase(Long id, LoginPrincipal loginPrincipal);



    /**
     * 新增采购单&完成采购单入库时,对sku信息的修改的方法
     * @param skuPurchaseInfo 对应数据的封装
     * @param purchaseId 采购单号
     */
    void setPurchaseInfoBat(String purchaseId, SkuPurchaseInfo[] skuPurchaseInfo, LoginPrincipal loginPrincipal);

    /**
     * 确认审核通过盘点时,对sku数据进行修改的方法
     * @param skuCheckInfo 更改的数量的数据封装
     * @param checkWarehouseId 盘点批次号
     */
    void setCheckInfoBat(Long checkWarehouseId, SkuCheckInfo[] skuCheckInfo, LoginPrincipal loginPrincipal);

    /**
     * 提交订单时,对sku数据进行修改(sku数量,最新出库时间)和检查,并且返回订单中商品的售价等信息的集合
     * @param skuOrderInfos 订单中的商品信息
     * @param oderId 订单号
     * @return 返回参数传过来的商品信息,但是增加了商品成本信息
     */
    SkuOrderInfo[] setOrderInfoBat(String oderId,SkuOrderInfo[] skuOrderInfos,LoginPrincipal loginPrincipal);

    /**
     * 定时任务,计算商品的销量,当前可售天数
     */
    void doCompute();

    /**
     * 查询已缺货商品  返回已缺货的sku列表
     * @return
     */
    List<SkuForPurchaseVO> listStockOut(int pageIndex,int pageSize);

    int count();

    /**
     * 查询所有信息
     * @return
     */
    List<SkuListItemVO> list();

    List<SkuDetailsVO> searchSku();
}



